//
// Created by LiuYou on 2021/12/6.
//

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>


int main(int argc, char** argv) {
    {
        std::vector<int> arr{5, 3, 1, 4, 2};
        std::copy( arr.begin(), arr.end(), std::ostream_iterator<int>( std::cout, "\t" ));
        std::cout << std::endl;

        const auto& partitionIter =
                std::partition( arr.begin(), arr.end(),
                                [&](const auto& item) {
                                    return item < 3;
                                } );

        std::copy( arr.begin(), arr.end(), std::ostream_iterator<int>( std::cout, "\t" ));
        std::cout << std::endl;

        std::cout << *partitionIter << std::endl;

        bool isPartitioned = std::is_partitioned( arr.begin(), arr.end(), [&](const auto& item) {
            return item < 3;
        } );

        std::cout << std::boolalpha << isPartitioned << std::endl;

        const auto& partitionIterator =
                std::partition_point( arr.begin(), arr.end(),
                                      [&](const auto& item) {
                                          return item < 3;
                                      } );
        std::cout << *partitionIterator << std::endl;

    }

    /*
     * todo 笔记: 总结: 这里呢, 我的想法是, 可以使用 partition();这些标准库提供的分区函数, 但是使用的时候一定要小心, 而且不要
     *  相信分区后的结果, 要打印出来进行查看是否真正进行了分区。即分区算法是一个不太好的设计。
     */

    return 0;
}
